package com.example.service;

import com.example.config.FeignConfiguration;
import com.example.service.impl.HystrixFallBackServiceImpl;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;


/**
 *配置日志增强配置类FeignConfiguration
 *
 * HystrixFallBackServiceImpl 配置全局降级处理fallback 函数，不能在service层再加@HystrixCommand 注解，不然会理解为使用局部的降级处理，因为局部降级处理有限级高于全局降级处理，全局处理必须再配置文件中开启fei-hystrix
 *
 * 熔断2中状态
 * 熔断关闭状态（Closed）：当服务访问正常时，熔断器处于关闭状态，服务调用方可以正常地对服务进行调用。
 * 熔断开启状态（Open）：默认情况下，在固定时间内接口调用出错比率达到一个阈值（例如 50%），熔断器会进入熔断开启状态。进入熔断状态后，后续对该服务的调用都会被切断，熔断器会执行本地的降级（FallBack）方法。
 * 半熔断状态（Half-Open）： 在熔断开启一段时间之后，熔断器会进入半熔断状态。在半熔断状态下，熔断器会尝试恢复服务调用方对服务的调用，允许部分请求调用该服务，并监控其调用成功率。如果成功率达到预期，则说明服务已恢复正常，熔断器进入关闭状态；如果成功率仍旧很低，则重新进入熔断开启状态。
 *
 * 熔断重要参数：
 * metrics.rollingStats.timeInMilliseconds	统计时间窗。
 * circuitBreaker.sleepWindowInMilliseconds	休眠时间窗，熔断开启状态持续一段时间后，熔断器会自动进入半熔断状态，这段时间就被称为休眠窗口期。
 * circuitBreaker.requestVolumeThreshold	请求总数阀值。 在统计时间窗内，请求总数必须到达一定的数量级，Hystrix 才可能会将熔断器打开进入熔断开启转态，而这个请求数量级就是 请求总数阀值。Hystrix 请求总数阈值默认为 20，这就意味着在统计时间窗内，如果服务调用次数不足 20 次，即使所有的请求都调用出错，熔断器也不会打开。
 * circuitBreaker.errorThresholdPercentage	错误百分比阈值。 当请求总数在统计时间窗内超过了请求总数阀值，且请求调用出错率超过一定的比例，熔断器才会打开进入熔断开启转态，而这个比例就是错误百分比阈值。错误百分比阈值设置为 50，就表示错误百分比为 50%，如果服务发生了 30 次调用，其中有 15 次发生了错误，即超过了 50% 的错误百分比，这时候将熔断器就会打开。
 *
 *
 *
 *
 */


//其中value值是服务名，就是spring.application.name 指定的名称， 在注册中心中是全大写的，这里可以用全大写也可以用全小写的形式都行
@Service
@FeignClient(value = "microservice-cloud-openfeign",configuration = FeignConfiguration.class,fallback = HystrixFallBackServiceImpl.class)
public interface HystrixOpenFeignService {

    @GetMapping("/info")
    String getOpenFeiInfo();

    @GetMapping("/timeout")
    String testTimeout();


}
